﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using vudu.EnlaceDatos.SqlServer;
using vudu.Logica.Clases;

namespace vudu.Logica.Clases
{
    public class Pensum
    {
        private int _idPensum;
        private DateTime _fechaInicio;
        private DateTime _fechaFin;
        private String _statusPensum;
        private int _creditoPensum;
        private List<Prelacion> _ListaPrelacion;
        private List<String> _PeridosActivo;

        #region Constructor
        public Pensum()
        {
            ListaPrelaciones = new List<Prelacion>();
        }
        public Pensum(DateTime fechaInicio, DateTime fechaFin, String statusPensum, int creditoPensum)
        {
            FechaInicio = fechaInicio;
            FechaFin = fechaFin;
            StatusPensum = statusPensum;
            CreditoPensum = creditoPensum;
        }
        #endregion

        #region Getters & Setters

        public int IdPensum
        {
            get 
            { 
                return _idPensum; 
            }
            
            set 
            { 
                _idPensum = value; 
            }
        }
        

        public DateTime FechaInicio
        {
            get 
            { 
                return _fechaInicio; 
            }
            set 
            {
                _fechaInicio = value; 
            }
        }
        

        public DateTime FechaFin
        {
            get 
            { 
                return _fechaFin; 
            }
            
            set 
            { 
                _fechaFin = value; 
            }
        }
        

        public String StatusPensum
        {
            get 
            { 
                return _statusPensum; 
            }
            
            set 
            { 
                _statusPensum = value; 
            }
        }
       

        public int CreditoPensum
        {
            get 
            { 
                return _creditoPensum; 
            }
            
            set 
            { 
                _creditoPensum = value; 
            }
        }

        public List<Prelacion> ListaPrelaciones
        {
            get
            {
                return _ListaPrelacion;
            }
            set
            {
                _ListaPrelacion = value;
            }
        }

        public List<String> PeriodosActivos
        {
            get
            {
                return _PeridosActivo;
            }
            set
            {
                _PeridosActivo = value;
            }
        }

        #endregion

        #region Metodos de Pensum
        

        #region Insertar una Prelacion
        /// <summary>
        /// Este metodo hace el manejo de la insercion de las prelaciones de una materia
        /// </summary>
        public bool insertarPrelacion(Pensum miPensum)
        {
            SqlServerPensum miServer = new SqlServerPensum();
            bool verificarInsercion= true;
            int idPensum = miPensum.IdPensum;
            //Se asume inicialmente que la materia no tiene prelaciones por eso se le asigna un indice de -1
            int idMateriaPrela = -1;

            try
            {
                // recorremos la lista del tipo prelacion en la clase Pensum
                foreach(Prelacion miPrelacion in miPensum.ListaPrelaciones)
                {
                    // le asignamos el id de la materia actual
                    int idMateriaActual = miPrelacion.MiMateriaPensum.Codigo;
                    if (miPrelacion.Prelaciones != null)
                    {
                        // recorremos la lista del tipo Materia en la clase Prelacion
                        foreach (Materia miMateria in miPrelacion.Prelaciones)
                        {
                            idMateriaPrela = miMateria.Codigo;
                            //Si la materia tiene prelaciones, se asocia la materia con el pensum pero con el idMateriaPrela
                           verificarInsercion= miServer.insertarPrelacionBD(miPrelacion, idMateriaActual, idMateriaPrela, idPensum);
                            idMateriaPrela = -1;
                        }
                    }
                    else
                    {
                        //Si la materia no tiene prelaciones, se asocia la materia con el pensum pero con el idMateriaPrela
                        //igual a -1
                      verificarInsercion = miServer.insertarPrelacionBD(miPrelacion, idMateriaActual, idMateriaPrela, idPensum);
                    }
                }
             
            } 
            catch
            {
                
            }
            return verificarInsercion;
        }
        #endregion
        // Este metodo consulta el ultimo pensum insertado
        public void ConsultarUltimoPensum()
        {
            SqlServerPensum miServer = new SqlServerPensum();
            //int ultimo = miServer.consultarUltimoIdPensum();
            miServer.consultarMaterias();
        }

        #region Verificar pensum
        // Este metodo devuelve la lista del tipo materia, extraidas de la clase conexion
        // sqlserverPensum.consultarMaterias()
        public List<Materia> ConsultarListaMateria()
        {
            SqlServerPensum sqlServerPensum = new SqlServerPensum();
            return sqlServerPensum.consultarMaterias();
        }

        // verificamos si un pensum existe, el metodo nos retorna un bool en el caso que el pensum exista
        public bool VerificarPensum (int idPensum) 
        {
            bool confirmacion = true;
        
            return confirmacion;
        }
        #endregion
        // Este metodo consulta las prelaciones de un pensum, la cual retorna una lista del tipo de la clase "prelacion"
        public List<Prelacion> ConsultarPrelaciones(Escuela escuela, Pensum MiPensum)
        {
            SqlServerPensum sqlServerPensum = new SqlServerPensum();
            return sqlServerPensum.ConsultarMateriasPensum(escuela.IdEscuela, MiPensum.IdPensum);

        }
        // Este metodo devuelve una lista de String, la cual consultar los periodos academicos de un pensum
        public List<String> ConsultarPeridosAcademicos(int idPensum)
        {
            SqlServerPensum sqlServerPensum = new SqlServerPensum();
            return sqlServerPensum.periodosActivos(idPensum);
        }
        // Este metodo hace el punto entre la clase interfaz y la clase sqlserverpensum para Activar un pensum
        public bool ActivarPensum(Pensum miPensum) 
        {
            SqlServerPensum sqlServerPensum = new SqlServerPensum();
            return sqlServerPensum.ActivarPensum(miPensum);
        }
        // Este metodo desactiva un pensum que este vigen, simplemente se le pasa el objeto del tipo Pensum
        public bool DesactivarPensum(Pensum miPensum)
        {
            SqlServerPensum sqlServerPensum = new SqlServerPensum();
            return sqlServerPensum.DesactivarPensum(miPensum);
        }

     
    }
        #endregion metodos de pensum

}